package com.cskaoyan.javase._0abstract._3exercise;

import com.sun.org.apache.bcel.internal.classfile.Code;

/**
 * 小试牛刀
 * 公司正在开发一套员工管理系统，需要对公司内部存在的员工进行管理
 * 公司将员工分为三类，
 *      1.普通员工负责杂项工作，
 *      2.程序员负责技术开发，
 *      3.经理负责统筹规划
 * 普通员工包含3个属性：姓名、工号以及工资，行为是工作
 * 程序员包含3个属性：姓名、工号以及工资，行为是工作和加班（overtime work）
 * 经理包含4个属性：姓名、工号、工资以及奖金（bonus），行为是工作
 * 请使用所学的知识设计该员工系统
 * 要求类中提供必要的方法进行属性访问（description）
 *
 * 肯定需要使用继承,那么谁来当父类呢?
 * 普通员工的成员,其它员工中都有,那么可不可以用它做父类呢?
 * 可以但是不合适:
 *      1.从长远角度来说,系统中存普通员工的对象,一旦普通员工修改了,会影响到其它员工,这不合理.
 *      2.普通员工定义一个普通类来做父类,就没有抽象方法,没有抽象方法所制定的"标准和规范"
 *          只要是员工都应该工作,而且工作内容不同,那么工作这个方法,所有的子类都必须强制实现
 *          那么这个方法应该是一个抽象方法
 *          抽象方法必须在抽象类中
 * 综上,我们需要定义一个抽象的员工类,作为顶层父类,用抽象方法制定规范和标准.
 *
 *
 * @since 10:47
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // 创建对象,测试
        BaseStaff bs;
        bs = new NormalStaff("张三", 1, 10000);
        bs.work();
        bs.printStaff();
        bs = new Coder("李四", 2, 20000);
        bs.work();
        bs.printStaff();
        // 程序员需要加班,这里需要强转
        if (bs instanceof Coder) {
            Coder c = (Coder) bs;
            c.overTimeWork();
        }
        bs = new Manager("麻子", 3, 30000, 100000);
        bs.work();
        bs.printStaff();
        if (bs instanceof Manager) {
            Manager m = (Manager) bs;
            System.out.println(m.bonus);
        }
    }
}

// 抽象员工类,作为父类
abstract class BaseStaff {
    String name;
    int id;
    double salary;

    public BaseStaff(String name, int id, double salary) {
        this.name = name;
        this.id = id;
        this.salary = salary;
    }

    public abstract void work();

    /*
        在抽象父类中
        定义一个打印属性的方法
        普通员工和程序员可以直接继承使用
        经理需要重写
     */
    public void printStaff() {
        System.out.println("id = " + id + "的员工,他的姓名是:" + name + ",他的工资是:" + salary);
    }
}

class NormalStaff extends BaseStaff {

    public NormalStaff(String name, int id, double salary) {
        super(name, id, salary);
    }

    @Override
    public void work() {
        System.out.println("做杂项工作!");
    }
}

class Coder extends BaseStaff {
    public Coder(String name, int id, double salary) {
        super(name, id, salary);
    }

    @Override
    public void work() {
        System.out.println("做技术开发!");
    }

    public void overTimeWork() {
        System.out.println("996");
    }
}

class Manager extends BaseStaff {

    double bonus;

    public Manager(String name, int id, double salary, double bonus) {
        super(name, id, salary);
        this.bonus = bonus;
    }

    @Override
    public void printStaff() {
        System.out.println("id = " + id + "的员工,他的姓名是:" + name + ",他的工资是:" + (salary + bonus));
    }

    @Override
    public void work() {
        System.out.println("做统筹规划!");
    }

}